/* 练习题 1：数组去重
请实现一个函数，输入一个数组，返回去重后的数组。
// 示例输入：
unique([1, 2, 2, 3, 4, 4, 5])
// 输出：
[1, 2, 3, 4, 5]
请你来写出函数 unique() 的实现代码
*/
// 算法复杂度 O(n) 空间复杂度 O(n)
// 法一： 使用 Set 数据结构来实现数组去重 Array.from() 方法可以将 Set 转换为数组 
function unique(arr) {
  return Array.from(new Set(arr));
}
// 算法复杂度 O(n^2) 空间复杂度 O(n)
// 法二： 使用indexOf() 方法来判断元素是否已经存在于新数组中 
function unique(arr) {
   let newArr = [];
    for (let i = 0; i < arr.length; i++) {
       if(newArr.indexOf(arr[i]) === -1) {
           newArr.push(arr[i]);
       }                
    }
   return newArr;
}
// 算法复杂度 O(n^2) 空间复杂度 O(n)
// 法三： 使用 filter() 方法来过滤掉重复的元素 
function unique(arr) {
  return arr.filter((item,index)=>{
    return arr.indexOf(item) === index;
  })
}
// 算法复杂度 O(n^2) 空间复杂度 O(n)
// 法四： 使用 reduce() 方法来实现数组去重 
function unique(arr) { 
    return arr.reduce((acc, item) => {
        // 如果 acc 中不包含 item，则将 item 添加到 acc 中
        if(!acc.includes(item)){
            acc.push(item);
        }
        return acc;
    }, []);
}
// 算法复杂度 O(n) 空间复杂度 O(n)
// 法五： 哈希表（算法复杂度 O(n)）
function unique(arr) {
    const map = new Map();
    arr.forEach(item => {
        // 将元素作为键存入 Map 中，值可以是任意值，这里使用 true
        map.set(item, true);
    });
    // 使用 Array.from() 将 Map 的键转换为数组
    return Array.from(map.keys());
}
 